﻿#pragma once

#include <learn/topo/topo_all.h>

namespace xi
{

namespace topo
{

class Topo_Builder
{
  public:
    /**
     * @brief 构建顶点
     *
     * @return Topo_Vertex*
     */
    static Topo_Vertex *create_vertex();

    /**
     * @brief 构建边
     *
     * @param[in] v1
     * @param[in] v2
     * @return Topo_Edge*
     */
    static Topo_Edge *create_edge(Topo_Vertex *v1, Topo_Vertex *v2);

    /**
     * @brief 构建线框
     *
     * @param[in] coedges
     * @return Topo_Wire*
     */
    static Topo_Wire *create_wire(const std::vector<Topo_Coedge *> &coedges);

    /**
     * @brief 构建面
     *
     * @param[in] coedges
     * @return Topo_Face*
     */
    static Topo_Face *create_face(const std::vector<Topo_Coedge *> &coedges);

    /**
     * @brief 构建面
     *
     * @param[in] wire
     * @return Topo_Face*
     */
    static Topo_Face *create_face(Topo_Wire *wire);

    /**
     * @brief 构建外壳
     *
     * @param[in] wire
     * @return Topo_Shell*
     */
    static Topo_Shell *create_shell(Topo_Wire *wire);

    /**
     * @brief 构建外壳
     *
     * @param[in] face
     * @return Topo_Shell*
     */
    static Topo_Shell *create_shell(Topo_Face *face);

    /**
     * @brief 构建外壳
     *
     * @param[in] shells
     * @return Topo_Shell*
     */
    static Topo_Shell *create_shell(const std::vector<Topo_Shell *> &shells);

    /**
     * @brief 删除顶点
     *
     * @param[in] v
     * @return true
     * @return false
     */
    static bool remove_vertex(Topo_Vertex *v);

    /**
     * @brief 删除边
     *
     * @param[in] e
     * @return true
     * @return false
     */
    static bool remove_edge(Topo_Edge *e);

    /**
     * @brief 删除 coedge
     *
     * @param[in] c
     * @return true
     * @return false
     */
    static bool remove_coedge(Topo_Coedge *c);

    /**
     * @brief 删除线框
     *
     * @param[in] w
     * @return true
     * @return false
     */
    static bool remove_wire(Topo_Wire *w);

    /**
     * @brief 删除面
     *
     * @param[in] f
     * @return true
     * @return false
     */
    static bool remove_face(Topo_Face *f);

    /**
     * @brief 删除外壳
     *
     * @param[in] s
     * @return true
     * @return false
     */
    static bool remove_shell(Topo_Shell *s);
};

} // namespace topo

} // namespace xi
